package com.dc.designPattern._7_decorator.impl;

/**
 * Description: 装饰者模式_客户端
 *
 * 星巴克咖啡订单项目（咖啡馆）：
 *     1) 咖啡种类/单品咖啡：Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)
 *     2) 调料：Milk、Soy(豆浆)、Chocolate
 *     3) 要求在扩展新的咖啡种类时，具有良好的扩展性、改动方便、维护方便
 *     4) 使用 OO 的来计算不同种类咖啡的费用: 客户可以点单品咖啡，也可以单品咖啡+调料组合。
 *
 *
 * @author: gdc
 * @date: 2021/3/14
 * @version 1.0
 */
public class Client {

    public static void main(String[] args){

        // 装饰者模式下的订单：2份巧克力+一份牛奶的LongBlack

        // step 1 点一份 LongBlack
        Drink order = new LongBlack();
        System.out.println("费用= " + order.cost());
        System.out.println("描述= " + order.getDes());

        // step 2 加一份牛奶
        order = new Milk(order);
        System.out.println("order 加入一份牛奶 费用 = " + order.cost());
        System.out.println("order 加入一份牛奶 描述 = " + order.getDes());

        // step 3 加一份巧克力
        order = new Chocolate(order);
        System.out.println("order 加入一份牛奶 加入一份巧克力 费用 = " + order.cost());
        System.out.println("order 加入一份牛奶 加入一份巧克力 描述 = " + order.getDes());

        // step 4 加一份巧克力
        order = new Chocolate(order);
        System.out.println("order 加入一份牛奶 加入2份巧克力 费用 = " + order.cost());
        System.out.println("order 加入一份牛奶 加入2份巧克力 描述 = " + order.getDes());

        System.out.println("===========================");

        Drink order2 = new DeCaf();
        System.out.println("费用= " + order2.cost());
        System.out.println("描述= " + order2.getDes());

        order2 = new Milk(order2);
        System.out.println("order2 加入一份牛奶 费用 = " + order2.cost());
        System.out.println("order2 加入一份牛奶 描述 = " + order2.getDes());

    }
}
